#ifndef DRM_DISPLAY_H
#define DRM_DISPLAY_H
#include <drm_fourcc.h>
#include <errno.h>
#include <fcntl.h>
#include <iostream>
#include <opencv2/opencv.hpp>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
#include <time.h>
#include <unistd.h>
#include <vector>
#include <xf86drm.h>
#include <xf86drmMode.h>

extern "C" {
#include "libavutil/imgutils.h"
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavutil/avassert.h>
#include <libavutil/hwcontext.h>
#include <libavutil/hwcontext_drm.h>
#include <libavutil/opt.h>
#include <libavutil/pixdesc.h>
#include <libswscale/swscale.h>
}

typedef struct DRMFramebuffer {
	int DrmPrimefd; // DRM PRIME fd for the object
	uint32_t FramebufferId;
} T_DRMFramebuffer, *PT_DRMFramebuffer;

class C_DRMDisplay
{
public:
	C_DRMDisplay();	 // 构造函数声明
	~C_DRMDisplay(); // 析构函数声明
	void SetFilePath(const char *filePath);
	int InitDRMParam();
	int CheckFramebuffExist(int iDrmPrimefd); // 检查对应的drmfb是否已经存在
	int InitDRMFb(AVFrame *frame, uint32_t format);
	int RenderFrameWithDRM(int iDrmPrimefd, int Width, int Height);

private:
	const char *pDevPath;			// drm设备名称
	int iDevfd;						// drm设备
	drmModeRes *pModeRes;			// drm设备的基本信息
	uint32_t iConnId;				// conn的索引
	uint32_t iCrtcId;				// crtc的索引
	drmModeConnector *pModeConn;	// 获取drm设备的Connector属性，为了获得modes
	drmModePlaneRes *pModePlaneRes; // 获取drm设备的图层信息
	drmModeAtomicReq *pAtomicReq;	// 原子请求
	uint32_t iPlaneId;				// 获取图层的索引
	uint32_t iBlobId;
	// 原子操作的结构体
	uint32_t iPropertyCrtcId;
	uint32_t iPropertyActive;
	uint32_t iPropertyModeId;
	uint32_t iPropertyfbId;
	uint32_t iPropertyCrtcX;
	uint32_t iPropertyCrtcY;
	uint32_t iPropertyCrtcW;
	uint32_t iPropertyCrtcH;
	uint32_t iPropertySrcX;
	uint32_t iPropertySrcY;
	uint32_t iPropertySrcW;
	uint32_t iPropertySrcH;
	std::vector<T_DRMFramebuffer> vtDRMFramebuffers; // 	framebuff的索引
};

#endif